﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez.Produccion.FaenamientoEnvasado;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Tecnopez.Globals;
using BussinessLogicTecnoPez;

public partial class Modules_FaenamientoEnvasado_ABMTareas : System.Web.UI.Page
{
    const string detalleSession = "DETALLE_TAREA";

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.Page.IsPostBack)
        {
            SetMode(PageMode.ListMode);
        }

        TPPEquipo.ObjType = typeof(Equipo);

        InicializarValidadores();
        InicializarGrillas();

        cmdEliminar.OnClientClick = "return confirm('Esta seguro de eliminar el registro?');";

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/work.png";
        master.Titulo = "Gestión de Tareas";
        cargarGrilla();
        _lblError.Text = "";
    }

    #region "Grillas"
    private void InicializarGrillas()
    {
        grdTareas.setupGrid(typeof(Tarea), cargarGrilla, true, true, this.ViewState);

        grdEquipos.AutoGenerateColumns = false;
        grdEquipos.Columns.Clear();

        BoundField objCol;
        objCol = new BoundField();
        objCol.DataField = "Equipo";
        objCol.HeaderText = "Equipo";
        grdEquipos.Columns.Add(objCol);

        objCol = new BoundField();
        objCol.DataField = "Cantidad";
        objCol.HeaderText = "Cantidad";
        grdEquipos.Columns.Add(objCol);

        ButtonField objColButton = new ButtonField();
        objColButton.ButtonType = ButtonType.Image;
        objColButton.CommandName = "DeleteRow";
        objColButton.HeaderText = "Quitar";
        objColButton.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        grdEquipos.Columns.Add(objColButton);

        string[] strKeys = new string[1];
        strKeys[0] = "IdEquipo";
        grdEquipos.DataKeyNames = strKeys;
    }

    private void cargarGrilla()
    {
        Tarea.getManager.ClearFilters();
        Tarea.getManager.ClearOrders();
        Tarea.getManager.AddFilter("IdTarea", GenericManager<Tarea>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");
        Tarea.getManager.AddFilter("Descripcion", GenericManager<Tarea>.filterOperator.Like, "%" + txtBuscarDescripcion.Text.Trim() + "%");

        if (ViewState[grdTareas.PageDataViewOrderKey] == null)
            Tarea.getManager.AddOrder("IdTarea", GenericManager<Tarea>.Order.orderDirection.DESC);
        else
            Tarea.getManager.AddOrder(ViewState[grdTareas.PageDataViewOrderKey].ToString(), (GenericManager<Tarea>.Order.orderDirection)ViewState[grdTareas.PageDataViewOrdenDireccionKey]);

        List<Tarea> lista = new List<Tarea>();
        lista = Tarea.getManager.GetFilter();
        grdTareas.DataSource = lista;
        grdTareas.DataBind();
    }

    private void cargarGrillaEquipos()
    {
        DetalleTarea lista = (DetalleTarea)Session[detalleSession];
        if (lista == null)
            grdEquipos.DataSource = null;
        else
            grdEquipos.DataSource = lista.ItemList;
        grdEquipos.DataBind();
    }

    protected void grdTareas_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "ver")
        {
            int IdTarea = int.Parse(grdTareas.DataKeys[System.Convert.ToInt32(e.CommandArgument)].Value.ToString());
            Tarea.getManager.ClearFilters();
            Tarea.getManager.AddFilter("IDTAREA", GenericManager<Tarea>.filterOperator.Equals, IdTarea);
            Tarea objTarea = Tarea.getManager.GetOne();

            txtCodigo.Text = objTarea.IdTarea.ToString();
            txtDescripcion.Text = objTarea.Descripcion.Trim();
            txtDuracion.Text = objTarea.Duracion.ToString().Replace(".00", "").Replace(",00", "");
            txtObservaciones.Text = objTarea.Observaciones.ToString();

            if (objTarea.DetalleTarea != null)
                Session[detalleSession] = objTarea.DetalleTarea;
            else
                Session[detalleSession] = null;
            cargarGrillaEquipos();

            SetMode(PageMode.ViewMode);
        }
    }
    protected void grdEquipos_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "DeleteRow")
        {
            DetalleTarea objDetalle = Session[detalleSession] as DetalleTarea;
            try
            {
                if (objDetalle == null)
                    return;

                foreach (EquipoTarea objItem in objDetalle.ItemList)
                {
                    if (objItem.IdEquipo == int.Parse(grdEquipos.DataKeys[int.Parse(e.CommandArgument.ToString())].Value.ToString()))
                    {
                        objDetalle.ItemList.Remove(objItem);
                        break;
                    }
                }
                Session[detalleSession] = objDetalle;
                _lblError.Text = "";
            }
            catch (Exception ex)
            {
                _lblError.Text = ex.Message;
            }
            finally
            {
                cargarGrillaEquipos();
            }
        }
    }
    #endregion

    #region "Validaciones"
    private void InicializarValidadores()
    {
        PPVDescripcion.SourceTypeName = "BussinessLogicTecnoPez.Produccion.FaenamientoEnvasado.Tarea";
        PPVDescripcion.ControlToValidate = "txtDescripcion";
        PPVDescripcion.PropertyName = "Descripcion";
        PPVDescripcion.DisplayMode = ValidationSummaryDisplayMode.List;

        PPVEquipo.SourceTypeName = "BussinessLogicTecnoPez.Produccion.FaenamientoEnvasado.EquipoTarea";
        PPVEquipo.ControlToValidate = "txtCantidad";
        PPVEquipo.PropertyName = "Equipo";
        PPVEquipo.DisplayMode = ValidationSummaryDisplayMode.List;
    }

    private bool validar(Tarea objeto)
    {
        ValidationResults v = Validation.Validate<Tarea>(objeto);
        if (!v.IsValid)
        {
            _lblError.Text = "Error en el formulario: Por favor verifique los campos ingresados.";
        }
        if (objeto.DetalleTarea == null || objeto.DetalleTarea.ItemList == null || objeto.DetalleTarea.ItemList.Count < 1)
        {
            _lblError.Text = "La tarea debe tener algún equipo asignado.";
            return false;
        }
        return v.IsValid;
    }

    private bool validarItemDetalle(EquipoTarea objeto)
    {
        ValidationResults v = Validation.Validate<EquipoTarea>(objeto);
        if (!v.IsValid)
        {
            _lblError.Text = "Error en el formulario: Por favor verifique los campos ingresados.";
        }
        return v.IsValid;
    }

    protected void PPVEquipo_ValueConvert(object sender, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.ValueConvertEventArgs e)
    {
        if (TPPEquipo.ItemSelected == null)
            e.ConvertedValue = null;
        else
            e.ConvertedValue = TPPEquipo.ItemSelected.ToString();
    }
#endregion

    #region "Modos"
    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        _lblError.Text = "";
        switch (mode)
        {
            case PageMode.ListMode:
                mvABM.ActiveViewIndex = 0;
                break;
            case PageMode.NewMode:
                mvABM.ActiveViewIndex = 1;
                //principal
                txtCodigo.ReadOnly = true;
                txtDescripcion.ReadOnly = false;
                txtDuracion.ReadOnly = false;
                txtObservaciones.ReadOnly = false;
                //equipos
                TPPEquipo.Enable = true;
                txtCantidad.ReadOnly = false;
                grdEquipos.Enabled = true;
                //botones
                cmdAgregarEquipo.Enabled = true;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;                
                break;
            case PageMode.EditMode:
                mvABM.ActiveViewIndex = 1;
                //principal
                txtCodigo.ReadOnly = true;
                txtDescripcion.ReadOnly = false;
                txtDuracion.ReadOnly = false;
                txtObservaciones.ReadOnly = false;
                //equipos
                TPPEquipo.Enable = true;
                txtCantidad.ReadOnly = false;
                grdEquipos.Enabled = true;
                //botones
                cmdAgregarEquipo.Enabled = true;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;     
                break;
            case PageMode.ViewMode:
                mvABM.ActiveViewIndex = 1;
                //principal
                txtCodigo.ReadOnly = true;
                txtDescripcion.ReadOnly = true;
                txtDuracion.ReadOnly = true;
                txtObservaciones.ReadOnly = true;
                //equipos
                TPPEquipo.Enable = false;
                txtCantidad.ReadOnly = true;
                grdEquipos.Enabled = false;
                //botones
                cmdAgregarEquipo.Enabled = false;
                cmdAceptar.Visible = false;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = true;
                cmdEliminar.Enabled = true;     
                break;
        }
    }

    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }
    #endregion
    protected void cmdNuevo_Click(object sender, EventArgs e)
    {
        Session[detalleSession] = null;
        txtCodigo.Text = "";
        txtDescripcion.Text = "";
        txtDuracion.Text = "";
        txtObservaciones.Text = "";

        TPPEquipo.ItemSelected = null;
        txtCantidad.Text = "";

        cargarGrillaEquipos();

        SetMode(PageMode.NewMode);
    }
    protected void cmdEditar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.EditMode);
    }
    protected void cmdEliminar_Click(object sender, EventArgs e)
    {
        try
        {
            Tarea objTarea = new Tarea();
            objTarea.IdTarea = int.Parse(txtCodigo.Text.Trim());
            if (Tarea.getManager.Delete(objTarea) < 1)
                throw Tarea.getManager.GeneratedException;
            SetMode(PageMode.ListMode);
            cargarGrilla();
        }
        catch (Exception ex)
        {
            _lblError.Text = "No se pudo eliminar el pedido.";
            Functions.LogError(ex);
        }
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        try
        {
            Tarea objTarea = new Tarea();
            objTarea.Descripcion = txtDescripcion.Text.Trim();
            objTarea.Duracion = decimal.Parse(txtDuracion.Text.Trim());
            objTarea.Observaciones = txtObservaciones.Text.Trim();

            objTarea.DetalleTarea = (DetalleTarea)Session[detalleSession];

            if (validar(objTarea))
            {
                if (getMode() == PageMode.NewMode)
                {
                    if (Tarea.getManager.Insert(objTarea) != true)
                    {
                        throw Tarea.getManager.GeneratedException;
                    }
                    SetMode(PageMode.ListMode);
                    cargarGrilla();
                    Session[detalleSession] = null;
                }
                else
                {
                    objTarea.IdTarea = int.Parse(txtCodigo.Text.Trim());
                    if (Tarea.getManager.Update(objTarea) != true)
                    {
                        throw Tarea.getManager.GeneratedException;
                    }
                    SetMode(PageMode.ViewMode);
                }
            }
        }
        catch (FormatException exc)
        {
            _lblError.Text = "Duración no posee el formato correcto.";
            Functions.LogError(exc);
        }
        catch (Exception exc)
        {
            _lblError.Text = "error: No se pudo realizar la operación.";
            Functions.LogError(exc);
        }
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.ListMode);
    }
    protected void cmdAgregarEquipo_Click(object sender, EventArgs e)
    {
        EquipoTarea item = new EquipoTarea();
        try
        {
            item.Equipo = TPPEquipo.ItemSelected as Equipo;
            item.Cantidad = int.Parse(txtCantidad.Text.Trim());

            if (validarItemDetalle(item))
            {
                DetalleTarea lista = Session[detalleSession] as DetalleTarea;
                if (lista == null)
                    lista = new DetalleTarea();
                lista.add(item);
                Session[detalleSession] = lista;

                cargarGrillaEquipos();

                TPPEquipo.ItemSelected = null;
                txtCantidad.Text = "";

                _lblError.Text = "";
            }
        }
        catch (BussinessLogicTecnoPezException exc)
        {
            _lblError.Text = exc.Message;
            Functions.LogError(exc);
        }
        catch (FormatException exc)
        {
            _lblError.Text = "Error de formato. Verifique los datos ingresados.";
            Functions.LogError(exc);
        }
        catch (Exception exc)
        {
            _lblError.Text = "error: No se pudo realizar la operación";
            Functions.LogError(exc);
        }
    }
}
